package com.trs.zk.common.config;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.trs.zk.common.collect.MapUtils;
import com.trs.zk.common.io.PropertiesUtils;
import com.trs.zk.common.lang.StringUtils;
import org.springframework.core.io.DefaultResourceLoader;

import java.io.File;
import java.io.IOException;
import java.util.Map;

/**
 * 全局配置类
 * @author msy
 */
public class Global {
	/**
	 * 上传文件基础虚拟路径
	 */
	public static final String USERFILES_BASE_URL = "/userfiles/";

	/**
	 * 操作：新增、编辑、授权
	 */
	public static final String OP_ADD = "add";
	public static final String OP_EDIT = "edit";
	public static final String OP_AUTH = "auth";

	/**
	 * 显示/隐藏
	 */
	public static final String SHOW = "1";
	public static final String HIDE = "0";

	/**
	 * 是/否
	 */
	public static final String YES = "1";
	public static final String NO = "0";

	/**
	 * 对/错
	 */
	public static final String TRUE = "true";
	public static final String FALSE = "false";

	/**
	 * 当前对象实例
	 */
	private static Global global = new Global();
	
	/**
	 * 保存全局属性值
	 */
	private static Map<String, String> props = MapUtils.newHashMap();


	/**
	 * 获取当前对象实例
	 */
	public static Global getInstance() {
		return global;
	}
	

	public static String getConfig(String key) {
		String config;
		if ((config = (String)props.get(key)) == null) {
			if ((config = PropertiesUtils.getInstance().getProperty(key)) != null) {
				props.put(key, config);
				return config;
			}

		}
		return config;
	}

	public static String getProperty(String key) {
		return getConfig(key);
	}

	public static String getProperty(String key, String defValue) {
		String a = getProperty(key);
		return StringUtils.isBlank(a) ? defValue : a;
	}

	/**
	 * 获取数据库名称
	 */
	@JsonIgnore
	public String getJdbcType(){
		return Global.getConfig("jdbc.type");
	}
	
	/**
	 * 获取管理端根路径
	 */
	public static String getAdminPath() {
		return getProperty("adminPath");
	}
	
	/**
	 * 获取前端根路径
	 */
	public static String getFrontPath() {
		return getProperty("frontPath");
	}
	
	/**
	 * 获取URL后缀
	 */
	public static String getUrlSuffix() {
		return getProperty("urlSuffix");
	}
	
	/**
	 * 是否是演示模式，演示模式下不能修改用户、角色、密码、菜单、授权
	 */
	public static Boolean isDemoMode() {
		String dm = getProperty("demoMode");
		return "true".equals(dm) || "1".equals(dm);
	}
	
	 
    
	/**
	 * 页面获取常量
	 * @see ${fns:getConst('YES')}
	 */
	public static Object getConst(String field) {
		try {
			return Global.class.getField(field).get(null);
		} catch (Exception e) {
			// 异常代表无配置，这里什么也不做
		}
		return null;
	}

    /**
     * 获取工程路径
     * @return
     */
    public static String getProjectPath(){
    	// 如果配置了工程路径，则直接返回，否则自动获取。
		String projectPath = Global.getProperty("projectPath");
		if (StringUtils.isNotBlank(projectPath)){
			return projectPath;
		}
		try {
			File file = new DefaultResourceLoader().getResource("").getFile();
			if (file != null){
				while(true){
					File f = new File(file.getPath() + File.separator + "src" + File.separator + "main");
					if (f == null || f.exists()){
						break;
					}
					if (file.getParentFile() != null){
						file = file.getParentFile();
					}else{
						break;
					}
				}
				projectPath = file.toString();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return projectPath;
    }


}
